<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Proxy</title>
</head>
<body>
	<textarea style="color: 333; width: 500px; height: 250px;">
Proxy 用于修改某些操作的默认行为
ES6 原生提供 Proxy 构造函数，用来生成 Proxy 实例。
var proxy = new Proxy(target, handler);

Proxy 支持的拦截操作一览:
（1）get(target, propKey, receiver)
拦截对象属性的读取，比如proxy.foo和proxy['foo']。
最后一个参数receiver是一个对象，可选，参见下面Reflect.get的部分。

（2）set(target, propKey, value, receiver)
拦截对象属性的设置，比如proxy.foo = v或proxy['foo'] = v，返回一个布尔值。

（3）has(target, propKey)
拦截propKey in proxy的操作，返回一个布尔值。

（4）deleteProperty(target, propKey)
拦截delete proxy[propKey]的操作，返回一个布尔值。

（5）ownKeys(target)
拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)，返回一个数组。该方法返回目标对象所有自身的属性的属性名，而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。

（6）getOwnPropertyDescriptor(target, propKey)
拦截Object.getOwnPropertyDescriptor(proxy, propKey)，返回属性的描述对象。

（7）defineProperty(target, propKey, propDesc)
拦截Object.defineProperty(proxy, propKey, propDesc）、Object.defineProperties(proxy, propDescs)，返回一个布尔值。

（8）preventExtensions(target)
拦截Object.preventExtensions(proxy)，返回一个布尔值。

（9）getPrototypeOf(target)
拦截Object.getPrototypeOf(proxy)，返回一个对象。

（10）isExtensible(target)
拦截Object.isExtensible(proxy)，返回一个布尔值。

（11）setPrototypeOf(target, proto)
拦截Object.setPrototypeOf(proxy, proto)，返回一个布尔值。


（12）apply(target, object, args)
目标对象是函数,拦截 Proxy 实例作为函数调用的操作，比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。

（13）construct(target, args)
目标对象是函数,拦截 Proxy 实例作为构造函数调用的操作，比如new proxy(...args)。
</textarea>
	<script type="text/javascript">
		var original = {};
		var oProxy = new Proxy(original, {
			get : function(target, key, receiver) {
				console.log(`getting ${key}!`);
				return Reflect.get(target, key, receiver);
			},
			set : function(target, key, value, receiver) {
				console.log(`setting ${key}!`);
				return Reflect.set(target, key, value, receiver);
			}
		});
		oProxy.count = 1
		++oProxy.count;
	</script>
</body>
</html>